今天就來講解第六題
給定一個"倒N”字型編碼的字串,還會給定編碼的高度numRows
請問我們解碼還原後的字串,原本內容應該是什麼?
1.特殊情況處理
當行數 numRows 等於 1 時,Z 字型變成單行,原字串不需要任何變化,因此直接返回原字串。
2.初始化行結構
使用一個 vector 來存儲每一行的字符。最多只需要 min(numRows, s.size()) 行來存儲字符,因為當字串長度小於行數時,不會用到那麼多行。
3.遍歷字串
遍歷字串中的每個字符,根據當前所在行 curRow 將字符加入到對應的行中。
4.當到達頂行 (curRow == 0) 或底行 (curRow == numRows - 1) 時,變換方向,即從向下走改為向上走或反之。
5.合併結果
遍歷 rows 中的每一行,將每一行的字符合併成最終的答案字串。
class Solution {
public:
string convert(string s, int numRows) {
if (numRows == 1) return s;
vector<string> rows(min(numRows, int(s.size())));
int curRow = 0;
bool goingDown = false;
// 將字符逐行加入對應的行
for (char c : s) {
rows[curRow] += c;
// 判斷是否需要改變行的方向
if (curRow == 0 || curRow == numRows - 1)
goingDown = !goingDown;
curRow += goingDown ? 1 : -1;
}
// 合併所有行,得到最終結果
string ans;
for (string row : rows)
ans += row;
return ans;
}
};